package kotlinquanweizhinan.chapt09.run

import java.io.File

class test {

}

fun main() {
    /*
    *  这里隐匿调用了File实例的readText函数。这和之前apply示例中调用setReadable、
    * setWriteable和setExecutable函数是一样的。不过，与apply不同，run返回的是lambda结果，也主是true或false值
    * */
    val menuFile = File("D:\\workstudy\\java\\target\\classes\\kotlinquanweizhinan\\chapt09\\run\\menu-file.txt")
    val serversDragonsBreath = menuFile.run{
        readText().contains("Dragon's Breath")
    }
    println(serversDragonsBreath)

    //run也能用来执行函数引用。经下是它们搭配使用的示例
    println("Madrigal".run(::nameIsLong))

    "Madrigal"
        .run(::nameIsLong)
        .run(::println)

    println("Polarcubis,Supreme Master of MyetHack".run(::nameIsLong))

    "Polarcubis,Supreme Master of MyetHack"
        .run(::nameIsLong)
        .run(::println)
    /*
    * 虽然这样的代码和nameIsLong("Madrigal")在功能上没区别，但要有多个函数调用.run
    * 的优势就显而易见了:使用run的链式函数调用会让代码的逻辑更清晰，更易读。例如，下面这
    * 段代码逻辑是检查玩家的字符数是否大于等于10，根据结果格式字符串并打印到控制台.
    * */

    "Polarcubis,Supreme Master of MyetHack"
        .run(::nameIsLong)
        .run(::playerCreateMesswage)
        .run(::println)

    //比较用run的链式调用和以下嵌套语法
    println(playerCreateMesswage(nameIsLong("Polarcubis,Supreme Master of MyetHack")))
    //显然，嵌套函数调用更难理解一些，因为在阅读理解代码时，相比由内往外，我们更熟悉自上而下的方式
}

fun nameIsLong(name:String) = name.length >=20
fun playerCreateMesswage(nameTooLong:Boolean):String{
    return if(nameTooLong) {
        "Name is too long.Please choose another name."
    }
    else
    {
        "Welcome.adventurer"
    }
}